package com.lnsoft.cac.server.handle.codec.frameMessage;


import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import lombok.Data;
import lombok.NonNull;

@Data
/**
 * 配置/状态交互---监测仪通信参数
 * */
public class Cfg_CommArg_Msg {
    private int Request_Set_Flag;       //1byte         参数配置类型标识： ①0x00查询配置信息②0x01设置配置信息
    private int Request_Flag;           //1byte         标识位：字节位自低向高依次对应9-14的各选择请求或设置的参数项，置1表示选择，置0表示未选择，如：0x05表示终端上行通信工作方式和APN用户名被选择
    private int Uplink_Type;            //1byte         终端上行通信工作方式：①0x00无线专网②0x02 短信息
    private byte[] APN;                 //16byte        无线通信APN(字符串) （无线专网使用）
    private byte[] APN_UserName;        //21byte        APN用户名(字符串) （无线专网使用）
    private byte[] APN_Password;        //21byte        APN密码(字符串) （无线专网使用）
    private int Heart_Beat_Cycle;       //1byte         心跳间隔（单位：分钟）（无线专网使用）
    private byte[] Message_Centor;      //20byte        短信中心号码（字符串）（短信使用）

    public ByteBuf toByteBuf() throws Exception{
        if (Request_Set_Flag != (byte)0x00 && Request_Set_Flag != (byte)0x01) {
            throw new Exception("参数配置类型标识 设置异常");
        }
        if (Uplink_Type != (byte)0x00 && Uplink_Type != (byte)0x02) {
            throw new Exception("终端上行通信工作方式 设置异常");
        }
        if (APN == null) {
            APN = new byte[16];
        }
        if (APN.length != 16) {
            throw new Exception("无线通信APN 设置异常");
        }
        if (APN_UserName == null) {
            APN_UserName = new byte[21];
        }
        if (APN_UserName.length != 21) {
            throw new Exception("APN用户名 设置异常");
        }
        if (APN_Password == null) {
            APN_Password = new byte[21];
        }
        if (APN_Password.length != 21) {
            throw new Exception("APN密码 设置异常");
        }
        if (Message_Centor == null) {
            Message_Centor = new byte[20];
        }
        if (Message_Centor.length != 20) {
            throw new Exception("短信中心号码 设置异常");
        }
        ByteBuf bf = Unpooled.buffer(82);
        bf.writeByte(Request_Set_Flag);
        bf.writeByte(Request_Flag);
        bf.writeByte(Uplink_Type);
        bf.writeBytes(APN);
        bf.writeBytes(APN_UserName);
        bf.writeBytes(APN_Password);
        bf.writeByte(Heart_Beat_Cycle);
        bf.writeBytes(Message_Centor);
        return bf;
    }




    //  解析 { 配置/状态交互---监测仪通信参数 } 帧报文内容区 到消息体中
    public static Cfg_CommArg_Msg decFrameBody(@NonNull byte[] frameBody) throws Exception {
        ByteBuf bf = Unpooled.wrappedBuffer(frameBody);
        Cfg_CommArg_Msg msg = new Cfg_CommArg_Msg();
        int len = frameBody.length;
        if (len == 0) {
            return null;
        }
        if (len != 82) {
            throw new Exception("frameBody 数据异常");
        }
        msg.setRequest_Set_Flag(bf.getByte(0) & 0xFF);
        msg.setRequest_Flag(bf.getByte(1) & 0xFF);
        msg.setUplink_Type(bf.getByte(2) & 0xFF);
        byte[] APN = new byte[16];
        bf.getBytes(3, APN, 0, 16);
        msg.setAPN(APN);
        byte[] APN_UserName = new byte[21];
        bf.getBytes(19, APN, 0, 21);
        msg.setAPN(APN_UserName);
        byte[] APN_Password = new byte[21];
        bf.getBytes(40, APN_Password, 0, 21);
        msg.setAPN(APN_Password);
        msg.setHeart_Beat_Cycle(bf.getByte(61) & 0xFF);
        byte[] Message_Centor = new byte[20];
        bf.getBytes(62, Message_Centor, 0, 20);
        msg.setAPN(Message_Centor);
        return msg;
    }

}
